#include <random.h>

/**** VERY IMPORTANT **** :
  The initial seeds z1, z2, z3, z4  MUST be larger than
  1, 7, 15, and 127 respectively.
****/
static uint32_t z1, z2, z3, z4;

void srand(uint32_t seed)
{
	if (seed < 128) {
		seed = 123456789UL + seed;
		return;
	}
	
	z1 = z2 = z3 = z4 = seed;
}

uint32_t rand(void)
{
	uint32_t b;

	b  = ((z1 << 6) ^ z1) >> 13;
	z1 = ((z1 & 4294967294UL) << 18) ^ b;
	b  = ((z2 << 2) ^ z2) >> 27;
	z2 = ((z2 & 4294967288UL) << 2) ^ b;
	b  = ((z3 << 13) ^ z3) >> 21;
	z3 = ((z3 & 4294967280UL) << 7) ^ b;
	b  = ((z4 << 3) ^ z4) >> 12;
	z4 = ((z4 & 4294967168UL) << 13) ^ b;
	return (z1 ^ z2 ^ z3 ^ z4);
}

